package main

import "fmt"

// make函数构造切片
func main() {
	// 定义切片
	s1 := make([]int, 5, 10)
	fmt.Printf("s1: %v len:%d cap:%d\n", s1, len(s1), cap(s1)) // s1: [0 0 0 0 0] len:5 cap:10

	// 切片本质就是一个框，框住了一块连续的内存
	// 切片属于引用类型，真正的数据保存在底层数组中，因此切片不能直接进行比较，如用 == 比较两个切片
	// nil 值的切片没有底层数组，且此切片的长度和容量均为 0，但是一个长度和容量均为 0 的切片值不一定为 nil
	// 判读一个切片是否为空，使用 len(name) == 0 来判断，不应该使用 s == nil判断
	s2 := []int{}
	s3 := make([]int, 0)
	fmt.Printf("s2: %v len:%d cap:%d\n", s1, len(s2), cap(s2)) // s2: [0 0 0 0 0] len:0 cap:0
	fmt.Printf("s3: %v len:%d cap:%d\n", s1, len(s3), cap(s3)) // s3: [0 0 0 0 0] len:0 cap:0

	// 切片的赋值拷贝(引用拷贝)
	s4 := []int{1, 2, 3}
	s5 := s4
	fmt.Println(s4, s5) // [1 2 3] [1 2 3]
	s4[0] = 100
	fmt.Println(s4, s5) // [100 2 3] [100 2 3]

	// 切片遍历
	// 索引遍历
	for i := 0; i < len(s4); i++ {
		fmt.Printf("s4[i]: %v\n", s4[i])
	}
	// for range遍历
	for _, v := range s4 {
		fmt.Printf("v: %v\n", v)
	}
}
